#include "PanelElegirPartida.h"
#include <string>
#include <iostream>

#include <map>


PanelElegirPartida::PanelElegirPartida(int x, int y) : nivelLabel("Nivel"),
    cantJugadoresLabel("N° Jugadores") {
    set_size_request(600, 600);
     jugadoresPorNivel = NULL;
    partidas = 0; //atributos para posicionar las partidas

    inicializarCoordenadasInsercion();

    cargarImagenFondo(IMAGEN_FONDO_HOME, x, y);

    button_crear.set_size_request(120, 30);

    button_crear.set_label("Crear partido");

    put(button_crear, 170, 5);

    /* Agrego los widget para elegir el nivel */
    setNivelMaximo(50);

    nivelLabel.override_color(Gdk::RGBA("white"),
                                    Gtk::STATE_FLAG_NORMAL);
    cantJugadoresLabel.override_color(Gdk::RGBA("white"),
                                    Gtk::STATE_FLAG_NORMAL);

    put(nivelLabel, 70, 50);
    put(cantJugadoresLabel, 70, 95);

    put(nivelSpinButton, 170, 50);
    put(cantJugadoresSpinButton, 170, 95);

    nivelSpinButton.signal_value_changed().connect(sigc::mem_fun(*this,
            &PanelElegirPartida::setCantidadJugadores));

    /* Agrego el boton de cerrar juego */
    button_cerrarJuego.set_size_request(120, 30);
    button_cerrarJuego.set_label("Cerrar sesión");
    put(button_cerrarJuego, 310, 5);

    show_all_children();
}

PanelElegirPartida::~PanelElegirPartida() {
    std::map<int, SalaPartida *>::iterator it;

    for (it = hashPartidas.begin(); it != hashPartidas.end(); it++) {
        if (it->second != NULL) {
            delete it->second;
            it->second = NULL;
        }
    }

    if (jugadoresPorNivel) {
        delete jugadoresPorNivel;
        jugadoresPorNivel = NULL;
    }
}

void PanelElegirPartida::bloquearPartidas(int idPartida) {
    std::map<int, SalaPartida *>::iterator it;

    for (it = hashPartidas.begin(); it != hashPartidas.end(); it++) {
        if (it->first != idPartida) {
            it->second->button_salir->set_sensitive(false);
        }

        it->second->button_unirme->set_sensitive(false);
    }
}

void PanelElegirPartida::desbloquearPartidas() {
    std::map<int, SalaPartida *>::iterator it;

    for (it = hashPartidas.begin(); it != hashPartidas.end(); it++) {
        it->second->button_unirme->set_sensitive(true);
        it->second->button_salir->set_sensitive(true);
    }
}

void PanelElegirPartida::configurar(int nivelMaximo,
                                    std::map<int, int> *jugadoresPorNivel) {
    this->jugadoresPorNivel = jugadoresPorNivel;

    setNivelMaximo(nivelMaximo);
    setCantidadJugadores();
}

void PanelElegirPartida::setNivelMaximo(int nivelMaximo) {
    nivelSpinButton.set_adjustment(Gtk::Adjustment::create(1, 1, nivelMaximo));
}

void PanelElegirPartida::setCantidadJugadores() {
    int cantJugadores =
               (*jugadoresPorNivel)[nivelSpinButton.get_value_as_int()];
    cantJugadoresSpinButton.set_adjustment(Gtk::Adjustment::create(2, 2,
                                           cantJugadores));
}

// despues ver como hacer para tomar directamente los id seleccionados, y
// evitar recorrer toda la lista
int PanelElegirPartida::obtenerIdPartida() {
    return 1;
}

void PanelElegirPartida::inicializarCoordenadasInsercion() {
    xScroll = 30;
    yScroll = 130;
}

void PanelElegirPartida::ajustarCoordenadasInsercion() {
    xScroll += 190; //distancia entre scroll partidas

    partidas++;

    if (partidas % 3 == 0) {
        yScroll += 270;
        xScroll = 30;
    }
}

void PanelElegirPartida::actualizarPosPartidas() {
    std::map<int, SalaPartida *>::iterator it;

    for (it = hashPartidas.begin(); it != hashPartidas.end(); ++it) {
        put(*it->second, xScroll, yScroll);

        ajustarCoordenadasInsercion();
    }
    show_all_children();
}

void PanelElegirPartida::borrarConectado(int idPartida, std::string nick) {
    std::map<int, SalaPartida *>::iterator it;
    it = hashPartidas.find(idPartida);
    if (it != hashPartidas.end()) {
        SalaPartida *sala = it->second;
        if (sala != NULL)
            sala->borrarConectado(nick);
    }
}

void PanelElegirPartida::borrarPartida(int id) {
    DEBUG_MSG("Borrando partida de panel...");
    std::map<int, SalaPartida *>::iterator it;
    // Elimino el panel de la partida (ver para que no falle)
    it = hashPartidas.find(id);
    if (it != hashPartidas.end()) {
        SalaPartida *sala = it->second;
        if (sala != NULL) {
            remove(*sala); // Remueve widget del panel
            delete sala;
            sala=NULL;
            hashPartidas[id] = NULL;
        }
        hashPartidas.erase(it);
    }

    partidas = 0; //para poder reordenar las partidas en las pantalla

    inicializarCoordenadasInsercion();

    actualizarPosPartidas();//reacomoda las partidas en la pantalla
}

void PanelElegirPartida::agregarConectado(int idPartida, std::string jug) {
    DEBUG_MSG("Agregando conectado a partida...");
    std::map<int, SalaPartida *>::iterator it;
    it = hashPartidas.find(idPartida);
    if (it != hashPartidas.end()) {
        SalaPartida *sala = it->second;
        if (sala != NULL)
            sala->agregarConectado(jug);
    }
}

void PanelElegirPartida::agregarPartida(SalaPartida *partida) {
    DEBUG_MSG("Agregando partida...");
    hashPartidas[partida->idPartida] = partida;
    put(*partida, xScroll, yScroll);
    ajustarCoordenadasInsercion();
    show_all_children();
}

void PanelElegirPartida::borrarPartidas() {
    DEBUG_MSG("Borrando partidas...");
    std::map<int, SalaPartida *>::iterator it;

    for (it = hashPartidas.begin(); it != hashPartidas.end(); it++) {
        if (it->second != NULL) {
            delete it->second;
            it->second = NULL;
        }
    }
    hashPartidas.clear();

    inicializarCoordenadasInsercion();
}

int PanelElegirPartida::obtenerNivel() {
    return nivelSpinButton.get_value_as_int();
}

int PanelElegirPartida::obtenerCantJugadores() {
    return cantJugadoresSpinButton.get_value_as_int();
}
